package cn.leaf.calculator.datasource;

import cn.leaf.calculator.bean.FormulationCalUnitEntity;
import org.springframework.core.convert.converter.Converter;

import java.io.Serializable;
import java.util.Iterator;
import java.util.List;

/**
 * 计算数据源
 *
 * @author 李克国
 * @version 1.0.0

 */
public interface CalDataSources<T> extends Iterator<FormulationCalUnitEntity<T>> {


    /**
     * 初始化
     */
    void initialize();

    /**
     * 获取需要计算的计算单元
     *
     * @return list by cal unit
     */
    List<T> getFormulaCalEntity();

    /**
     * 更新参数
     * <p> 传入的params 中有效的为id，此方法需更新参数中的value值</p>
     *
     * @param params 参数
     */
    List<T> updateParamEntity(List<Serializable> params);

    /**
     * 获取计算结果，会获取计算项标记为计算完成的实体类
     *
     * @return list by result
     */
    List<T> getCalResult();

    /**
     * 清除参数池
     */
    void clearParameters();

    /**
     * 清除计算项
     */
    void clearCalUnit();

    /**
     * 添加一个计算项
     *
     * @param unitEntity 计算单元
     */
    void add(FormulationCalUnitEntity<T> unitEntity);

    /**
     * 删除一个计算项
     * @param id id
     */
    void remove(Serializable id);

    /**
     * 设置类型转换器
     *
     * @param converter 类型转换器
     */
    void setConverter(Converter<T, ? extends FormulationCalUnitEntity<T>> converter);
}
